home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #1 / Amiga Plus CD - 1997 - No. 01.iso / pd / programmierung / proasm / routines / locks.r < prev    next >
Text File  |  1994-04-04  |  8KB  |  465 lines

  1.  
  2. ;---;  locks.r  ;--------------------------------------------------------------
  3. *
  4. *    ****    LOCKS, FILES AND DIRECTORIES    ****
  5. *
  6. *    Author        Stefan Walter
  7. *    Version        0.00
  8. *    Last Revision    15.02.94
  9. *    Identifier    lfd_defined
  10. *       Prefix        lfd_    (Locks, Files and Directories)
  11. *                 ¯      ¯         ¯
  12. *    Functions    RememberCD, RestoreCD, IsFile, GetParentDir,
  13. *            GetLAEInfo, FreeLAEInfo, AddToDirList, FreeDirList,
  14. *            FindFileDirList, GetPathFromLock
  15. *
  16. ;------------------------------------------------------------------------------
  17.  
  18.     IFND    lfd_defined
  19. lfd_defined    SET    1
  20.  
  21. ;------------------
  22. lfd_oldbase    EQU __BASE
  23.     base    lfd_base
  24. lfd_base:
  25.  
  26. ;------------------
  27.  
  28.  
  29. ;------------------------------------------------------------------------------
  30. *
  31. * GetPathFromLock    Get the full path of a file or directory with
  32. *            a given lock.
  33. *
  34. * INPUT:    d0:    Lock.
  35. *        a0:    Buffer.
  36. *
  37. * RESULT:    d0:    Lock or 0 if an error occured.
  38. *        a0:    Buffer.
  39. *        ccr:    On d0.
  40. *
  41. ;------------------------------------------------------------------------------
  42.  
  43.     IFD    xxx_GetPathFromLock
  44.  
  45. GetPathFromLock:
  46.     movem.l    d1-a6,-(sp)
  47.     moveq    #0,d7
  48.     move.l    a0,a4
  49.     clr.b    (a4)
  50.     moveq    #0,d5
  51.     move.l    d0,d4
  52.  
  53.     moveq    #1,d1
  54.     moveq    #65,d0
  55.     lsl.l    #2,d0
  56.     move.l    4.w,a6
  57.     jsr    -198(a6)        ;AllocMem()
  58.     tst.l    d0
  59.     beq    .done
  60.     move.l    d0,a3
  61.  
  62.     move.l    d4,d1
  63.     move.l    DosBase(pc),a6
  64.     jsr    -96(a6)            ;DupLock()
  65.     move.l    d0,d6
  66.     beq.s    .free
  67.  
  68. .l:    move.l    d6,d1
  69.     move.l    a3,d2
  70.     jsr    -102(a6)        ;Examine()
  71.     tst.l    d0    
  72.     beq.s    .unl
  73.  
  74.     moveq    #-1,d4
  75.     lea    8(a3),a2
  76. .cnt:    addq.l    #1,d4    
  77.     tst.b    (a2)+
  78.     bne.s    .cnt
  79.  
  80.     move.l    a4,a0
  81.     addq.l    #1,a0
  82.     add.l    d5,a0
  83.     move.l    a0,a1
  84.     move.w    d4,d3
  85.     tst.w    d5
  86.     beq.s    .nd1
  87.     addq.w    #1,d4
  88. .nd1    add.l    d4,a1
  89.     move.w    d5,d0
  90. .mv:    move.b    -(a0),-(a1)
  91.     dbra    d0,.mv
  92.     tst.w    d5
  93.     beq.s    .nd2
  94.     move.b    #"/",-(a1)
  95. .nd2:    move.l    a2,a0
  96.     move.l    a1,a2
  97.     subq.l    #1,a0
  98. .cp:    move.b    -(a0),-(a1)
  99.     subq.w    #1,d3
  100.     bne.s    .cp
  101.     move.l    d6,d0
  102.     CALL_    GetParentDir
  103.     bne.s    .nd3
  104.     move.b    #":",(a2)
  105.     tst.w    d5
  106.     bne.s    .nroot
  107.     clr.b    1(a2)
  108. .nroot:    moveq    #-1,d7
  109.     bra.s    .free
  110.  
  111. .nd3:    move.l    d0,d6
  112.     add.l    d4,d5
  113.     bra.s    .l
  114.  
  115.  
  116. .unl:    move.l    d6,d1
  117.     move.l    DosBase(pc),a6
  118.     jsr    -90(a6)            ;UnLock()
  119.     
  120. .free:    move.l    a3,a1
  121.     moveq    #65,d0
  122.     lsl.l    #2,d0
  123.     move.l    4.w,a6
  124.     jsr    -210(a6)        ;FreeMem()
  125.  
  126. .done:    move.l    d7,d0
  127.     movem.l    (sp)+,d1-a6
  128.     rts
  129.  
  130.  
  131.     ENDC
  132.  
  133. ;------------------------------------------------------------------------------
  134. *
  135. * AddToDirList    Add an entry to directory list.
  136. *
  137. * INPUT:    d0:    Path.
  138. *
  139. * RESULT:    d0:    Entry or 0 if error.
  140. *
  141. ;------------------------------------------------------------------------------
  142.  
  143.     IFD    xxx_AddToDirList
  144.  
  145. AddToDirList:
  146.     movem.l    d1-a6,-(sp)
  147.     CALL_    GetLAEInfo
  148.     beq.s    \done
  149.     move.l    d0,d4
  150.     move.l    a0,a4
  151.     CALL_    IsFile
  152.     bpl.s    \rem
  153.     CALL_    GetParentDir
  154.     beq.s    \unlck
  155.     move.l    d0,d4
  156.  
  157. \rem:    move.l    DosBase(pc),a6
  158.     move.l    d4,d1
  159.     jsr    -96(a6)            ;DupLock()
  160.     move.l    d0,d3
  161.     beq.s    \unlck
  162.     
  163.     moveq    #8,d0
  164.     moveq    #0,d1
  165.     move.l    4.w,a6
  166.     jsr    -198(a6)        ;AllocMem()
  167.     tst.l    d0
  168.     beq.s    \undl
  169.  
  170.     move.l    d0,a0
  171.     clr.l    (a0)
  172.     move.l    d3,4(a0)
  173.     lea    lfd_dirList(pc),a1
  174. \l:    tst.l    (a1)
  175.     beq.s    \cp
  176.     move.l    (a1),a1
  177.     bra.s    \l
  178.  
  179. \cp:    move.l    a0,(a1)
  180.     bra.s    \unlck
  181.  
  182. \undl:    move.l    DosBase(pc),a6
  183.     move.l    d3,d1
  184.     jsr    -90(a6)            ;UnLock()
  185.     moveq    #0,d0
  186.  
  187. \unlck:    move.l    d4,d0
  188.     move.l    a4,a0
  189.     CALL_    FreeLAEInfo
  190.     tst.l    d0
  191.  
  192. \done:    movem.l    (sp)+,d1-a6
  193.     rts
  194.  
  195.     ENDC
  196.  
  197.  
  198.  
  199. ;------------------------------------------------------------------------------
  200. *
  201. * FreeDirList    Free all entries of the directory list.
  202. *
  203. ;------------------------------------------------------------------------------
  204.  
  205.     IFD    xxx_FreeDirList
  206.  
  207. FreeDirList:
  208.     movem.l    d0-a6,-(sp)
  209.     move.l    lfd_dirList(pc),a4
  210.  
  211. \loop:    move.l    a4,d7
  212.     beq.s    \done
  213.     move.l    (a4),a4
  214.  
  215.     move.l    d7,a1
  216.     move.l    4(a1),d6
  217.     moveq    #8,d0
  218.     move.l    4.w,a6
  219.     jsr    -210(a6)        ;FreeMem()
  220.  
  221.     move.l    d6,d1
  222.     move.l    DosBase(pc),a6
  223.     jsr    -90(a6)            ;UnLock()
  224.     bra.s    \loop
  225.  
  226. \done:    movem.l    (sp)+,d0-a6
  227.     rts
  228.  
  229.     ENDC
  230.  
  231.  
  232.  
  233. ;------------------------------------------------------------------------------
  234. *
  235. * FindFileDirList    Search a file in all directories. Changes current
  236. *            directory.
  237. *
  238. * INPUT:    d0:    Path.
  239. *
  240. * RESULT:    d0:    Lock on file or 0.
  241. *        a0:    Examine block.
  242. *        ccr:    On d0.
  243. *
  244. ;------------------------------------------------------------------------------
  245.  
  246.     IFD    xxx_FindFileDirList
  247. FindFileDirList:
  248.     movem.l    d1-d7/a1-a6,-(sp)
  249.     move.l    d0,d7
  250.     lea    lfd_dirList(pc),a4
  251.  
  252. \loop:    move.l    d7,d0
  253.     CALL_    GetLAEInfo
  254.     bne.s    \done
  255.     move.l    (a4),a4
  256.     move.l    a4,d0
  257.     beq.s    \done
  258.     move.l    4(a4),d1
  259.     move.l    DosBase(pc),a6
  260.     jsr    -126(a6)        ;CurrentDir()    
  261.     bra.s    \loop
  262.  
  263. \done:    movem.l    (sp)+,d1-d7/a1-a6
  264.     rts
  265.     ENDC
  266.  
  267.  
  268.  
  269. ;------------------------------------------------------------------------------
  270. *
  271. * RememberCD    Remember current directory.
  272. * RestoreCD    Restore current directory.
  273. *
  274. ;------------------------------------------------------------------------------
  275.  
  276.     IFD    xxx_RememberCD
  277.  
  278. RememberCD:
  279.     movem.l    d0-a6,-(sp)
  280.     move.l    DosBase(pc),a6
  281.     moveq    #0,d1    
  282.     jsr    -126(a6)        ;CurrentDir()
  283.     lea    lfd_oldCD(pc),a0
  284.     move.l    d0,(a0)
  285.     move.l    d0,d1
  286.     jsr    -126(a6)        ;CurrentDir()
  287.     movem.l    (sp)+,d0-a6
  288.     rts
  289.  
  290.     ENDC
  291.  
  292.  
  293.  
  294.     IFD    xxx_RestoreCD
  295.  
  296. RestoreCD:
  297.     movem.l    d0-a6,-(sp)
  298.     move.l    DosBase(pc),a6
  299.     move.l    lfd_oldCD(pc),d1
  300.     jsr    -126(a6)        ;CurrentDir()
  301.     movem.l    (sp)+,d0-a6
  302.     rts
  303.  
  304.     ENDC
  305.  
  306.  
  307.  
  308. ;------------------------------------------------------------------------------
  309. *
  310. * GetLAEInfo    Get lock and examine file or directory.
  311. *
  312. * INPUT:    d0:    Path.
  313. *
  314. * RESULT:    d0:    Lock or 0.
  315. *        a0:    Examine block.
  316. *        ccr:    On d0.
  317. *
  318. ;------------------------------------------------------------------------------
  319.  
  320.     IFD    xxx_GetLAEInfo
  321.  
  322. GetLAEInfo:
  323.     movem.l    d1-d7/a1-a6,-(sp)
  324.     move.l    d0,d4
  325.  
  326.     move.l    #260/4,d0
  327.     lsl.l    #2,d0
  328.     moveq    #0,d1
  329.     move.l    4.w,a6
  330.     jsr    -198(a6)        ;AllocMem()
  331.     move.l    d0,d5
  332.     beq.s    \done
  333.  
  334.     move.l    d0,d7
  335.     move.l    d4,d1
  336.     moveq    #-2,d2
  337.     move.l    DosBase(pc),a6
  338.     jsr    -84(a6)            ;Lock()
  339.     move.l    d0,d4
  340.     beq.s    \free
  341.  
  342.     move.l    d4,d1
  343.     move.l    d5,d2
  344.     jsr    -102(a6)        ;Examine()
  345.     move.l    d5,a0
  346.     exg.l    d0,d4
  347.     tst.l    d0
  348.     bne.s    \done
  349.  
  350. \unlck:    move.l    d4,d1
  351.     jsr    -90(a6)            ;UnLock()
  352.  
  353. \free:    moveq    #260/4,d0
  354.     lsl.l    #2,d0
  355.     move.l    d5,a1
  356.     move.l    4.w,a6
  357.     jsr    -210(a6)        ;FreeMem()
  358.     moveq    #0,d0
  359.  
  360. \done:    movem.l    (sp)+,d1-d7/a1-a6
  361.     rts
  362.  
  363.     ENDC
  364.  
  365.  
  366.  
  367. ;------------------------------------------------------------------------------
  368. *
  369. * FreeLAEInfo    Free lock and examine block.
  370. *
  371. * INPUT:    d0:    Lock, 0 accepted.
  372. *        a0:    Examine block.
  373. *
  374. ;------------------------------------------------------------------------------
  375.  
  376.     IFD    xxx_FreeLAEInfo
  377.  
  378. FreeLAEInfo:
  379.     movem.l    d0-a6,-(sp)
  380.  
  381.     move.l    a0,d5
  382.     move.l    d0,d1
  383.     beq.s    \done
  384.     move.l    DosBase(pc),a6
  385.     jsr    -90(a6)            ;UnLock()
  386.  
  387.     moveq    #260/4,d0
  388.     lsl.l    #2,d0
  389.     move.l    d5,a1
  390.     move.l    4.w,a6
  391.     jsr    -210(a6)        ;FreeMem()
  392.  
  393. \done:    movem.l    (sp)+,d0-a6
  394.     rts
  395.  
  396.     ENDC
  397.  
  398.  
  399.  
  400. ;------------------------------------------------------------------------------
  401. *
  402. * IsFile    Check if an examined object is a file.
  403. *
  404. * INPUT:    a0:    Examine block.
  405. *
  406. * RESULT:    ccr:    MI if file, PL if directory.
  407. *
  408. ;------------------------------------------------------------------------------
  409.  
  410.     IFD    xxx_IsFile
  411.  
  412. IsFile:    tst.l    4(a0)
  413.     rts
  414.  
  415.     ENDC
  416.  
  417.  
  418.  
  419. ;------------------------------------------------------------------------------
  420. *
  421. * GetParentDir    Get parent directory lock. The old lock is unlocked.
  422. *
  423. * INPUT:    d0:    Lock.
  424. *
  425. * RESULT:    d0:    Lock or 0 if previous was root.
  426. *        ccr:    On d0.
  427. *
  428. ;------------------------------------------------------------------------------
  429.  
  430.     IFD    xxx_GetParentDir
  431.  
  432. GetParentDir:
  433.     movem.l    d1-a6,-(sp)
  434.     move.l    DosBase(pc),a6
  435.     move.l    d0,d1
  436.     move.l    d0,d7
  437.     jsr    -210(a6)        ;ParentDir()
  438.     move.l    d0,d6
  439.     move.l    d7,d1
  440.     jsr    -90(a6)            ;UnLock()
  441.     move.l    d6,d0
  442.     movem.l    (sp)+,d1-a6
  443.     rts
  444.  
  445.     ENDC
  446.  
  447.  
  448.  
  449. ;--------------------------------------------------------------------
  450.  
  451. lfd_oldCD:    dc.l    0
  452. lfd_dirList:    dc.l    0
  453.  
  454.  
  455. ;--------------------------------------------------------------------
  456.  
  457.     base    lfd_oldbase
  458.  
  459. ;------------------
  460.  
  461.     ENDIF
  462.  
  463.     end
  464.  
  465.